package business;

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import utils.HibernateUtil;
import entities.Auteur;
import entities.Boek;
import entities.Lid;
import entities.Medewerker;
import entities.Persoon;

public class AuteurWijziger implements IEntityWijziger<Auteur>
{
	private Auteur auteur;
	
	private String naam;
	private String voornaam;
	private String tussenvoegsel;
	private Set<Boek> boeken;
	
	// Constructor
	
	public AuteurWijziger(Auteur auteur)
	{
		this.auteur = auteur;
		this.naam = auteur.getNaam();
		this.voornaam = auteur.getVoornaam();
		this.tussenvoegsel = auteur.getTussenvoegsel();
		this.boeken = auteur.getBoeken();
	}

	// Getters en Setters
	
	public String getNaam()
	{
		return naam;
	}
	public void setNaam(String naam)
	{
		this.naam = naam;
	}
	public String getVoornaam()
	{
		return voornaam;
	}
	public void setVoornaam(String voornaam)
	{
		this.voornaam = voornaam;
	}
	public String getTussenvoegsel()
	{
		return tussenvoegsel;
	}
	public void setTussenvoegsel(String tussenvoegsel)
	{
		this.tussenvoegsel = tussenvoegsel;
	}
	public Set<Boek> getBoeken()
	{
		return boeken;
	}
	/**
	 * Verandert de set van boeken die geschreven zijn door deze auteur.
	 * Gebruik deze methode zorgvuldig om te voorkomen dat boeken ongewild worden
	 * verwijderd. Gebruik zoveel mogelijk addBoek() of removeBoek().
	 * @param boeken
	 */
	public void setBoeken(Set<Boek> boeken)
	{
		this.boeken = boeken;
	}
	
	// Methoden
	
	public void addBoek(Boek boek)
	{
		boeken.add(boek);
	}
	public void removeBoek(Boek boek)
	{
		boeken.remove(boek);
	}
	public boolean hasBoek(Boek boek)
	{
		return boeken.contains(boek);
	}
	
	@Override
	public void update()
	{
		Session session = null;
		Transaction tx = null;
		
		try
		{
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			
			auteur = (Auteur) session.merge(auteur); // make sure the entity is unique.
			
			wijzigAuteur();
			
			session.update(auteur);
			
			tx.commit();
		}
		catch(RuntimeException e)
		{
			if(tx != null)
			{
				tx.rollback();
			}
		}
		finally
		{
			if(session != null)
			{
				session.close();
			}
		}
	}

	private void wijzigAuteur()
	{
		auteur.setNaam(naam);
		auteur.setVoornaam(voornaam);
		auteur.setTussenvoegsel(tussenvoegsel);
		auteur.setBoeken(boeken);
	}
}
